package com.example.springboot.config.netty;

import io.netty.util.HashedWheelTimer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.TimeUnit;

/**
 * 时间轮算法名副其实，时间轮就是一个环形的数据结构，类似于表盘，将时间轮分成多个bucket(比如：0-8)。假设每个时间轮轮片的分隔时间段tickDuration=1s
 * （即：指针经过每个格子花费时间是 1 s），当前的时间bucket=3，那么在18秒后需要被执行的任务需要落到（（3+18）%8=5取余运算）的5号bucket上。
 * 假如有多个需要在该时间段内执行的任务，就会组成一个双向链表。另外针对时间轮我们要有下面的几个认知：
 * <p>
 * <p>
 * 时间轮指针是一个Worker线程，在时间轮整点的时候执行双向链表中的任务。
 * <p>
 * <p>
 * 时间轮算法的并不是精准的延时，它的执行精度取决于每个时间轮轮片的分隔时间段tickDuration
 * <p>
 * <p>
 * Worker线程是单线程，一个bucket、一个bucket的顺序处理任务。「所以我们的延时任务一定要做成异步任务，否则会影响时间轮后续任务的执行时间。」
 *
 * @Author:ChenZhangKun
 * @Date: 2022/9/3 15:30
 */
@Configuration
public class WheelTimerConfig {
    @Bean
    public HashedWheelTimer hashedWheelTimer() {
        return new HashedWheelTimer(100, TimeUnit.SECONDS, 512);
    }
}
